package NO1_Array;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 2025-08-21
 * 力扣 - 189. 轮转数组
 * <p>
 * 给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
 */
public class RotateMain {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7};
        rotate(nums, 3);
    }

    // 双端队列
//    public static void rotate(int[] nums, int k) {
//        // 使用双端队列
//        Deque<Integer> deque = new ArrayDeque<>();
//        for (int num : nums) {
//            deque.offerLast(num);
//        }
//
//        // 旋转操作
//        for (int i = 0; i < k; i++) {
//            int removed = deque.pollLast();
//            deque.offerFirst(removed);
//        }
//
//        // 使用toArray()方法转换
//        Integer[] tempArray = deque.toArray(new Integer[0]);
//
//        // 将Integer[]转回int[]并写回原数组
//        for (int i = 0; i < nums.length; i++) {
//            nums[i] = tempArray[i];
//        }
//    }

    // 额外数组 - 原数组的第i个元素，它在新数组中的位置是 (i + k) % n
    public static void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n; // 处理k大于数组长度的情况

        // 创建临时数组
        int[] temp = new int[n];

        // 将原数组复制到临时数组
        System.arraycopy(nums, 0, temp, 0, n);

        // 重新排列：后k个元素放到前面，前n-k个元素放到后面
        for (int i = 0; i < n; i++) {
            nums[(i + k) % n] = temp[i];
        }
    }
}
